package ar.edu.utn.frsf.tpae.a2012.g05.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;

import ar.edu.utn.frsf.tpae.a2012.g05.dao.CuentaDao;
import ar.edu.utn.frsf.tpae.a2012.g05.dao.MovimientoDao;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Movimiento;
import ar.edu.utn.frsf.tpae.a2012.g05.entity.Pago;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.NegocioException;
import ar.edu.utn.frsf.tpae.a2012.g05.exception.PersistenciaException;
import ar.edu.utn.frsf.tpae.a2012.g05.service.CuentaService;
import ar.edu.utn.frsf.tpae.a2012.g05.service.MovimientoService;

@Service
public class MovimientoServiceImpl implements MovimientoService {

	@Autowired  @Qualifier("movimientoDaoImpl")
	private MovimientoDao movimientoDao;
	
	@Autowired  @Qualifier("cuentaDaoImpl")
	private CuentaDao cuentaDao;
	
	@Autowired
	private CuentaService cuentaService;
	
	public Movimiento saveOrUpdate(Movimiento movimiento) {
		// agregar validaciones de lógica de negocio
		movimientoDao.saveOrUpdate(movimiento);
		return movimiento;
	}

	public void delete(Movimiento movimiento) throws NegocioException {
		// agregar validaciones de lógica de negocio
		try {
			movimientoDao.delete(movimiento);
		} catch (PersistenciaException e) {
			throw new NegocioException("No se encuentra el movimiento a eliminar.");
		}
	}

	public Movimiento findById(Integer id) {
		// agregar validaciones de lógica de negocio
		Movimiento movimiento = movimientoDao.findById(id);
		return movimiento;
	}

	public List<Movimiento> findAll() {
		// agregar validaciones de lógica de negocio
		List<Movimiento> movimientos = movimientoDao.findAll();
		return movimientos;
	}

	public List<Movimiento> findMovimientosCuenta(Cuenta cuenta)  throws NegocioException{
		
		Cuenta cuentaRecuperada = cuentaDao.findById(cuenta.getId());
		if(cuentaRecuperada == null) {
			throw new NegocioException("La cuenta no existe.");
		}
		return movimientoDao.findByIdCuenta(cuenta.getId());
	}

	public Pago realizarPago(Pago pago) throws NegocioException {
		// debito el monto de la cuenta
		cuentaService.debitar(pago.getCuenta(), pago.getMonto());
		// el pago debe ser un monto negativo en los movimientos
		pago.setMonto(pago.getMonto().negate());
		// guardo el movimiento
		movimientoDao.saveOrUpdate(pago);
		
		return pago; 
	}
	
	public void setMovimientoDao(MovimientoDao movimientoDao) {
		this.movimientoDao = movimientoDao;
	}

	public void setCuentaDao(CuentaDao cuentaDao) {
		this.cuentaDao = cuentaDao;
	}

	public void setCuentaService(CuentaService cuentaService) {
		this.cuentaService = cuentaService;
	}
}
